/**
 * Eclipse Outliner
 * Copyright (C) 2006 Jeff Mesnil
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License. 
 */
package net.jmesnil.outliner.ui.actions;

import net.jmesnil.opml.core.IOutline;
import net.jmesnil.outliner.ui.editors.OutlinerEditor;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchWindow;

public class OutlineIndentAction extends Action {

    private static final String ID = "net.jmesnil.outliner.ui.actions.OutlineIndentAction";

    private IWorkbenchWindow window;

    public OutlineIndentAction(IWorkbenchWindow window) {
        this.window = window;
        setId(ID);
        setActionDefinitionId(ID);
        setAccelerator(SWT.TAB);
        setText("Indent");

    }

    public void run() {
        OutlinerEditor editor = (OutlinerEditor) window.getActivePage()
                .getActiveEditor();
        TreeViewer viewer = editor.getViewer();
        ISelection selection = viewer.getSelection();
        if (selection instanceof StructuredSelection) {
            StructuredSelection structured = (StructuredSelection) selection;
            Object element = structured.getFirstElement();
            if (element instanceof IOutline) {
                IOutline outline = (IOutline) element;
                IOutline previousSibling = outline.getPreviousSibling();
                if (previousSibling == null) {
                    Display.getCurrent().beep();
                    return;
                }
                boolean editing = viewer.isCellEditorActive();
                if (editing) {
                    viewer.getCellModifier().modify(
                            viewer.getTree().getSelection()[0], "text",
                            editor.getTextCellEditor().getValue());
                    viewer.cancelEditing();
                }
                IOutline movedOutline = outline.getParent()
                        .removeChild(outline);
                previousSibling.appendChild(movedOutline);

                viewer.refresh(true);
                viewer.setSelection(new StructuredSelection(movedOutline));
                viewer.reveal(movedOutline);
                if (editing) {
                    viewer.editElement(movedOutline, 0);
                }
            }
        }
    }

    public void selectionChanged(IAction action, ISelection selection) {
    }

}
